//
//  LWEmoticonKeyBoardView.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/20.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit

//  重用标记
private let LWEmoticonCollectionViewCellIdentifier = "LWEmoticonCollectionViewCellIdentifier"

class LWEmoticonKeyBoardView: UIView {

   
    //MARK: - 懒加载控件
    private lazy var toolBar: LWEmoticonToolBar = {
        
       let view = LWEmoticonToolBar(frame: CGRectZero)
        
        return view
        
        
    }()
    
    
    //放置表情的CollectionView
    private lazy var emoticonCollectionView: UICollectionView = {
        //布局方式
        let flowLayout = UICollectionViewFlowLayout()
        
        //设置水平滚动
        flowLayout.scrollDirection = .Horizontal
        
        let view = UICollectionView(frame: CGRectZero, collectionViewLayout: flowLayout)
        
        //去掉水平方向和垂直方向的滚动条
        view.showsHorizontalScrollIndicator = false
        view.showsVerticalScrollIndicator = false
        
        //开启分页模式
        view.pagingEnabled = true
        
        //去掉弹簧效果
        view.bounces = false
        
        //颜色 和当前视图一样
        view.backgroundColor = self.backgroundColor
        
        
        //注册cell
        view.registerClass(LWEmoticonCollectionViewCell.self, forCellWithReuseIdentifier: LWEmoticonCollectionViewCellIdentifier)
        
        //要在当前视图实现数据源代理 那么设置数据源代理
        view.dataSource = self
        view.delegate = self
        
        return view
        
    }()
    
    
    override init(frame: CGRect) {
        
        super.init(frame: frame)
        
        layoutUI()
        
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

    
    
    //MARK: - 布局
    private func layoutUI() {
        
        backgroundColor = UIColor(patternImage: UIImage(named: "emoticon_keyboard_background")!)
        
        addSubview(emoticonCollectionView)
        addSubview(toolBar)
        
        emoticonCollectionView.snp_makeConstraints { (make) -> Void in
            
            make.top.leading.trailing.equalTo(self)

            make.bottom.equalTo(self.toolBar.snp_top)
            
        }
        
        
        toolBar.snp_makeConstraints { (make) -> Void in
            
            make.leading.bottom.trailing.equalTo(self)
         
            make.height.equalTo(30)
            
            
        }

        
        //toolBar上面按钮的点击事件闭包
        toolBar.selectedToolBarButtonClosure = { [weak self] (type: LWEmoticonToolBarButtonType) in
            
            //获取枚举的原始值 在减去  1000得到 0，1，2 对应组
            let tag = type.rawValue - 1000
            
            //根据原始值(即button的tag值) 让collectionView滚动到哪个区域
            let indexPath = NSIndexPath(forItem: 0, inSection: tag)
            
            self!.emoticonCollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .None, animated: false)
            
            
        }
        
        toolBar.selectedButtonWithSection(0)
        
    }
    
    
    //MARK: - 对cell布局
    //在这里面拿到的子控件的大小是准确的
    override func layoutSubviews() {
        
        super.layoutSubviews()
        
        //获取到floWlayout
        let flowLayout = emoticonCollectionView.collectionViewLayout as! UICollectionViewFlowLayout
        
        //对每个cell的大小布局
        flowLayout.itemSize = emoticonCollectionView.size
        
        //水平距离
        flowLayout.minimumInteritemSpacing = 0
        
        //竖直间距
        flowLayout.minimumLineSpacing = 0
        
    }
    
    
    
    
    
}





//MARK: - 数据源方法
extension LWEmoticonKeyBoardView: UICollectionViewDataSource, UICollectionViewDelegate {
    
    /*
    这里三维数组中的元素是二维数组  二维数组中的元素是一维数组
    
    三维数组中元素的个数 对应着组数 也即是toolBar上的按钮个数
    
    二维数组中元素的个数 对应着每一组有多少个cell 
    
    一维数组中的元素 对应着cell上的内容  每一个一维数组中,元素个数对应着每一个cell上控件的个数 即表情数
    
    */
    
    //组数 对应着那三个按钮  也即是三维数组的个数
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        
        return LWEmoticonTools.sharedEmoticonTools.allEmoticonArr.count
        
    }
    
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        
        return LWEmoticonTools.sharedEmoticonTools.allEmoticonArr[section].count
        
        
    }
    
    
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell  {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(LWEmoticonCollectionViewCellIdentifier, forIndexPath: indexPath) as! LWEmoticonCollectionViewCell
        
        cell.emoticonsArr = LWEmoticonTools.sharedEmoticonTools.allEmoticonArr[indexPath.section][indexPath.item]
        
        
        return cell
        
    }
    
    /*  这个代理方法中的逻辑 是第一种通过滚动拿到每一个cell对应的 indexPath
    
    func scrollViewDidScroll(scrollView: UIScrollView) {
        
        /*
        convertPoint(point: CGPoint, toView view: UIView?) -> CGPoint
        这个方法中,第一个参数:标记的点(锚点),这个点是对于keyWindow上的点不可以移动  定义了之后,就在keyWindow上了
        第二个参数: 将标记的点(也就是第一个参数)设置在哪个视图上,就相当于在视图上订了一个钉子,这个锚点不会随着视图的滚动而发生变化,永远都在屏幕(主窗口)上,不会移动,这样才能起到标记作用
        
        */
        
        //给当前视图定一个锚点  相当于在当前视图(toView:后面这个视图)的
        let inputPoint = self.convertPoint(emoticonCollectionView.center, toView: emoticonCollectionView)
        
        
        
        
        /*
        indexPathForItemAtPoint(point: CGPoint) -> NSIndexPath?
        
        这个方法的意思是,根据上面的方法所标记的锚点,来获取滚动到这个某点处的Item（cell） 的 indexPath
        相当于只要cell滚动到锚点这里,就给滚动到这里的cell打了一个标记,通过这个标记我们就能找到是哪个cell,从而能获取到这个cell所对应的 indexPath
        */
        
        
        let indexPath = emoticonCollectionView.indexPathForItemAtPoint(inputPoint)
        
        toolBar.selectedButtonWithSection((indexPath?.section) ?? 0)
        
        
    }
    */

    
   
    
    //第二种方法  通过滚动拿到每一个cell对应的 indexPath
    func scrollViewDidScroll(scrollView: UIScrollView) {
        
        //获取屏幕显示的cell, visibleCells() -> 当前的CollectionView上最多能显示多少个cell
        //这个方法不会给我们通过每个cell的 x 坐标进行排序,因为重用机制,所以返回的都是无序的  我们需要进行排序  sort 可以进行排序
        //值得提的是,显示的cell的 x 坐标最大也就是一个CollectionView的宽度
        let cells = emoticonCollectionView.visibleCells().sort { (firstCell, secondCell) -> Bool in
            
            //通过sort进行x坐标从小到大的排序
            return firstCell.x < secondCell.x
            
            
        }
        
        
        //判断哪个cell显示得多,这样就可以实现当cell滚动超过屏幕一半时,显示另一个表情了
        //判断当最懂能显示2个cell的时候,我们来进行比较cell谁显示得多
        if cells.count == 2 {
            
            //第一个cell
            let firstCell = cells.first!
            //第二个cell
            let secondCell = cells.last!
            
            //计算第一个cell的x坐标与水平偏移量的差值 取绝对值 因为第一个cell的偏移量多半为负值  水平偏移量是指: 屏幕左边超出的部分
            let firstCellContenOffsetX = abs(firstCell.x - scrollView.contentOffset.x)
            
            //记录哪个cell
            let cell: UICollectionViewCell
            
            //当这个偏移量firstCellContenOffsetX 值超过CollectionView宽度的一般时,说明第一个cell在屏幕内的部分不足屏幕宽的一半,这时说明第二个cell已经超过了屏幕的一半了,要比第一个cell在屏幕内显示的多
            if firstCellContenOffsetX < emoticonCollectionView.width * 0.5 {
                
//                print("第一个cell显示的多")
                
                cell = firstCell
                
                
            }else {
                
//                print("第二个cell显示的多")
                
                cell = secondCell
                
                
            }
            
            //通过cell获取对应的indexPath
            let indexPath = emoticonCollectionView.indexPathForCell(cell)!
            
            //调用方法
            toolBar.selectedButtonWithSection(indexPath.section)
            
        }
        
        
    }
    
    
    
    
  
    
}





